玩转SQLite |
您所在的位置:网站首页 › aoc q27p2u q27p1u › 玩转SQLite |
SQLite是一个跨平台的轻量级数据库,支持C/C++开发,可用于嵌入式中,关于C/C++使用SQLite的简单实例,之前这篇文章,已经介绍过一种简单的使用方式。本篇来介绍另一种更加高效的调用方式。 1.1 普通方式之前的文章介绍过sqlite3的C语言API函数基础操作,通过 sqlite3_exec函数即可执行sql语句函数,该函数指定一个 sql语句字符串和对应的回调函数。 当执行sqlite3_exec时,其内部的执行可分为3步: 解析sql语句字符串 编译sql语句 执行sql语句可以看到,sqlite3_exec一个函数就实现了这么多功能,这是它的 优点——使用方便,但同时也是它的 缺点——效率低,因为解析和编译都是比较耗时的。 1.2 高效方式为此解决sqlite3_exec函数执行效率低的问题,就出现了其它更加高效的解决方式: 将sqlite3_exec的功能进行分解,由多个函数共同完成。这就是本篇要介绍的: sqlite3_prepare_v2()函数:实现对sql语句(模板)的解析和编译,生成了可以被执行的 sql语句实例 sqlite3_stmt()数据结构:可以理解为一种”准备语句对象”,它可以结合变量使用,进而实现相同操作的循环 sqlite3_bind_*() 函数:用于绑定赋值变量 sqlite3_step() 函数:用于执行sql语句相比较使用sqlite3_exec函数,现在这种方式,sql语句的解析和编译只执行了一次,而sqlite3_step执行多次,整体的效率势必大大提升。 2.1 sqlite3错误码在介绍每个函数之前,让我们先来看看其中一个函数的错误代码。 [En]Before introducing each function, let’s take a look at the error codes of one of these functions. #define SQLITE_OK 0 #define SQLITE_ERROR 1 #define SQLITE_INTERNAL 2 #define SQLITE_PERM 3 #define SQLITE_ABORT 4 #define SQLITE_BUSY 5 #define SQLITE_LOCKED 6 #define SQLITE_NOMEM 7 #define SQLITE_READONLY 8 #define SQLITE_INTERRUPT 9 #define SQLITE_IOERR 10 #define SQLITE_CORRUPT 11 #define SQLITE_NOTFOUND 12 #define SQLITE_FULL 13 #define SQLITE_CANTOPEN 14 #define SQLITE_PROTOCOL 15 #define SQLITE_EMPTY 16 #define SQLITE_SCHEMA 17 #define SQLITE_TOOBIG 18 #define SQLITE_CONSTRAINT 19 #define SQLITE_MISMATCH 20 #define SQLITE_MISUSE 21 #define SQLITE_NOLFS 22 #define SQLITE_AUTH 23 #define SQLITE_FORMAT 24 #define SQLITE_RANGE 25 #define SQLITE_NOTADB 26 #define SQLITE_NOTICE 27 #define SQLITE_WARNING 28 #define SQLITE_ROW 100 #define SQLITE_DONE 101 2.2 sqlite3_prepare_v2该函数实现对sql语句(模板)的解析和编译,生成了可以被执行的sql语句实例 int sqlite3_prepare_v2( sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail );参数: db:sqlite数据库 zSql:要执行的sql语句(可以包含未赋值的变量) nByte:sql语句的(字符串的)长度 ppStmt:解析编译出的sql语句实例 pzTail:返回值:见前面的sqlite3错误码 2.3 sqlite3_bind该函数组用于 绑定变量值到prepare语句中,也就是给 sqlite3_stmt变量赋值。前面的文章讲过,我们一定是先通过sqlite3_prepare_v2函数创建并初始化一个 sqlite3_stmt 变量语句,然后使用sqlite3_bind_xxx函数对 这个 sql语句变量进行绑定参数。 int sqlite3_bind_int(sqlite3_stmt*, int, int); int sqlite3_bind_doubule(sqlite3_stmt*, int, double); int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int, void(*)(void*));参数: 形参1:sqlite3_stmt: prepare语句编译出的sql语句实例 形参2: sqlite3_stmt变量参数的序号索引值,规定最左侧的SQL参数的索引值为 1,也就是说参数索引值从1开始。 形参3: 是要绑定给第2个形参指向的 变量参数的 实际值。第2个形参可以指向不同的索引值。 形参4: 对于有4个形参的函数,第4个形参一般是第3个形参的长度。 形参5: 是用于BLOB和字符串绑定后的 析构函数,用于在sqlite处理完blob或字符串之后处理它,一般可以设置为NULL。返回值:见前面的sqlite3错误码 代码示例:假设表的字段结构为:person(name,age,sex),数据库指针为 pdb。 sqlite3_stmt *pstmt; const char *sql = "INSERT INTO person(name, age, sex) VALUES(?,?,?);"; nRet = sqlite3_prepare_v2(pdb, sql, strlen(sql), &pstmt, &pzTail); int i; for(i = 0; i < 10; i++){ nCol = 1; sqlite3_bind_text(pstmt, nCol++, a[i].name, strlen(a[i].name), NULL); sqlite3_bind_int(pstmt, nCol++, a[i].age); sqlite3_bind_text(pstmt, nCol++, a[i].sex, strlen(a[i].name), NULL); sqlite3_step(pstmt); sqlite3_reset(pstmt); } sqlite3_finalize(pstmt); 2.4 sqlite3_step int sqlite3_step(sqlite3_stmt *pStmt);参数: pStmt:prepare语句编译出的sql语句实例返回值: 以下是几个更常见的返回值: [En]Here are a few more common return values: SQLITE_DONE:意味着 sql语句执行完成且成功。一旦执行成功后,sqlite3_step()就不应该被再次调用执行,除非我们使用sqlite3_reset()重置 sqlite3_stmt 数据。SQLITE_ROW:这个比较常用,当我们的sql语句是 读命令, 比如”SELECT FROM…”,返回的数据一般很多,并且数据是按行返回的,且每次只返回一行*,其返回值为 SQLITE_ROW,所以需要重复调用sqlite3_step函数,直到sqlite3_step返回 SQLITE_DONE. SQLITE_MISUSE: 表示该函数实例被滥用,不合适,比如sqlite_stmt结构已经被销毁了。 2.5 sqlite3_reset int sqlite3_reset(sqlite3_stmt *pStmt);用于重置一个准备语句对象到它的初始状态,然后准备被重新执行。所有sql语句变量使用sqlite3_bind*绑定值,使用sqlite3_clear_bindings重设这些绑定。Sqlite3_reset接口重置准备语句到它代码开始的时候。sqlite3_reset并不改变在准备语句上的任何绑定值,那么这里猜测,可能是语句在被执行的过程中发生了其他的改变,然后这个语句将它重置到绑定值的时候的那个状态。 2.6 sqlite3_column该函数实例用于 查询(query)结果的筛选,返回当前结果的某1列。 int sqlite3_column_int(sqlite3_stmt*, int iCol); double sqlite3_column_double(sqlite3_stmt*, int iCol); const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);参数: sqlite3_stmt*:prepare语句编译出的sql语句实例 iCol: 要查询的”列”索引值。sqlite3规定最左侧的”列”索引值是 0,也就是”列”索引号从 0 开始。返回: 根据函数类型,返回相应的数据,比如int型,double型(浮点数也是),text(字符串型)等。本篇主要介绍了sqlite的C语言操作的高效API函数,用于取代功能强大但效率较低的 sqlite3_exec函数。本篇介绍到的几个API函数总结如下: sqlite3_prepare_v2() 创建sqlite3_stmt对象 sqlite3_bind_*() 绑定参数值到sqlite3_stmt sqlite3_step() 运行sql语句,可以是一次,也可以是循环执行 sqlite3_reset() 重置sqlite3_stmt对象 sqlite3_finalize() 销毁sqlite3_stmt对象在第二部分中,我们将通过一个实际例子来体验这些功能的具体效果。 [En]In the second part, we will experience the specific effects of these functions through a practical example. Original: https://blog.csdn.net/hbsyaaa/article/details/127858034Author: 码农爱学习Title: 玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数 相关阅读 Title: hive安装 ———附下载链接、安装过程中所遇问题及解决办法(linux)目录 一、前期准备 1. hive 及相关配置文件下载 1. hadoop集群 2. 安装mysql 二、安装hive 1. 解压并安装 Hive 使用下面的命令,解压 Hive 安装包: 2. 配置 MySQL 3 .配置 Hive 5.启动 Hive 6. 配置hive下的mysql数据库 7. 验证 Hive 安装是否成功 三、遇到问题及解决 在启动hive时出现如下问题: 原因: 解决过程: 一、前期准备 信息版本存放位置用户主机名hadoop集群hadoop3.3/home/hadoop/software/hadoopHadoopMastermysqlmysql5.7/homerootHadoopMasterhivehive3.1.2/home/hadoop/software/hadoopHadoopMaster 注: 在安装过程中如果有要写HadoopMster的地方,请换成自己的主机名 在有/home/hadoop/software/路径时,请对应换成自己相应存放hive的路径 配置hive是在hadoop集群的master主机下配置的 1. hive 及相关配置文件下载http://链接:https://pan.baidu.com/s/1YdQ-93Rpls7rM_i375K85w?pwd=ukdz 注:这三个都要下载 ,之后配置会用到 1. hadoop集群该部分的安装需要在Hadoop 已经成功安装的基础上,并且要求 Hadoop 已经正常启动。 如果hadoop集群没有部署好的可以参看这篇文章:https://editor.csdn.net/md/?articleId=127031634 2. 安装mysql如果mysql没有安装好的可以参考这篇文章:https://mp.csdn.net/mp_blog/creation/editor/127597908 二、安装hive 1. 解压并安装 Hive 使用下面的命令,解压 Hive 安装包: cd /home/hadoop/software/ tar -zxvf apache-hive-3.1.2-bin.tar.gz mv apache-hive-3.1.2-bin hive3.1.2 #重命名 cd hive3.1.2执行一下ls -l 命令会看到下面的图片所示内容,这些内容是 Hive 包含的文件: 2 . 配置 MySQL mysql -u root -p #然后创建 myhive 用户: grant all on *.* to myhive@'%' identified by '123456'; grant all on *.* to myhive@'localhost' identified by '123456'; grant all on *.* to myhive@'HadoopMaster' identified by '123456'; flush privileges; #刷新 注意:这里的HadoopMaster要对于改为自己hadoop集群中master节点的主机名 创建数据库: create database hive01; 3 . 配置 Hive(1)进入hive 安装目录下的配置目录,然后修改配置文件: 注:如果主机名和我的不一样的要把配置文件中的HadoopMaster 对应换成自己的主机名 cd /home/hadoop/software/hive3.1.2/conf 在windows上先打开一个txt文件,然后在文件中添加如下内容 hive.metastore.local true javax.jdo.option.ConnectionURL jdbc:mysql://HadoopMaster:3306/hive01?characterEncoding=UTF-8 javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName myhive javax.jdo.option.ConnectionPassword 123456然后将文件另存为 hive-site.xml 文件,注意这里的后缀是xml 写好之后,将hive-site.xml 文件上传到/home/hadoop/software/hive3.1.2/conf 目录下,上传好之后ll即可看到。 (2)将 mysql 的java connector 复制到依赖库中 ps -ef | grep mysql #查看mysql是否启动,如下所示即为启动 如果没有启动的则先启动mysql ( /home/mysql5.7/support-files/mysql.server start) mysql -u root -p #登录mysql用户(3)将文件 mysql-connector-java.jar 上传到hive的lib目录下 (4) 使用下面的命令打开配置: vi /home/hadoop/.bash_profile #在文件中添加如下内容 export HIVE_HOME=/home/hadoop/software/hive3.1.2 export PATH=$HIVE_HOME/bin:$PATH #这里的/home/hadoop/software/hive3.1.2 是自己存放hive的路径 添加好之后保存退出,输入:source ~/.bash_pofile 5. 启动 Hive输入:hive 提醒:如果这里启动hive的时候出现错误,请直接跳到后面遇到问题及解决办法 注:到了这里hive的下的mysql数据库还不能正常使用,要先初始化hive下的mysql数据库 6. 配置hive下的mysql数据库 /home/hadoop/software/hive3.1.2/bin schematool -dbType mysql --initSchema #初始化mysql数据库初始化之后等待完成,出现 schemaTool completed就可以了。 7. 验证 Hive 安装是否成功 hive show databases;三、遇到问题及解决 在启动hive时出现如下问题:Exception in thread “main” java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V at org.apache.hadoop.conf.Configuration.set(Configuration.java:1380) at org.apache.hadoop.conf.Configuration.set(Configuration.java:1361) at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:536) at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:554) at org.apache.hadoop.mapred.JobConf. at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5141) at org.apache.hadoop.hive.conf.HiveConf. at org.apache.hadoop.hive.common.LogUtils.initHiveLog4jCommon(LogUtils.java:97) at org.apache.hadoop.hive.common.LogUtils.initHiveLog4j(LogUtils.java:81) at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:699) at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.hadoop.util.RunJar.run(RunJar.java:323) at org.apache.hadoop.util.RunJar.main(RunJar.java:236) 原因:这是因为hadoop下的java剖出来的异常,因为版本不一样 解决过程: 进入 hadoop的/hadoop-3.3.0/share/hadoop/common/lib 路径下ll | grep guav 筛选查询以guva 开头的jar包 进入 hive3.1.2/lib 路径下 ll | grep guav 筛选查询以guva 开头的jar包 可以看到在hadoop下的guava-27.0-jre.jar包是27版本的,而在hive下的 guava-19.0.jar 是19版本 将hive 下的包删除guava-19.0.jar 进入到hadoop的路径下 cp guava-27.0-jre.jar /home/hadoop/software//hive3.1.2/lib/ #将guava-27.0-jre.jar复制到hive的lib目录下 从新启动hive就可以了Original: https://blog.csdn.net/m0_61232019/article/details/127656281Author: 冷-风-吹Title: hive安装 ———附下载链接、安装过程中所遇问题及解决办法(linux) 原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/405138/ 转载文章受原作者版权保护。转载请注明原作者出处! |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |